# 定义类
# 定义师傅类:属性和方法
class master(object):
    def __init__(self):
        self.gongfu = "好运来"

    def make_cake(self):
        print(f'使用{self.gongfu}配方做蛋糕')


# 定义学校类:属性和方法
class School(object):
    def __init__(self):
        self.gongfu = '菲尔雪'

    def make_cake(self):
        print(f'使用{self.gongfu}配方做蛋糕')

        # 带参数的super用法
        # super(School,self).__init__()
        # super(School,self).make_cake()

        # 不带参数的super用法
        super().__init__()
        super().make_cake()

# 定义徒弟类：继承师傅类和学校类,
class prentice(School, master):
    def __init__(self):
        self.gongfu='独家技术'

    def make_cake(self):
        #加自己初始化的原因：如果不进行初始化的化，kongfu属性值输出的是上一个init内的kongfu属性值
        self.__init__()
        print(f'使用{self.gongfu}配方做蛋糕')

    #子类调用父类的同名属性和方法：把父类的同名属性再次封装
    def make_master(self):
        #父类属性名。函数（）
        #父类再次初始化的原因：这里想要调用父类的同名方法和属性，属性在init初始化位置，所以需要再次调用init
        master.__init__(self)
        master.make_cake(self)

    def make_School(self):
        School.__init__(self)
        School.make_cake(self)
#需求：一次性调用父类Master，School的方法
    def make_old_cake(self):
        #方法一：如果定义的类名修改，这里也需要修改，麻烦，代码冗长
        # School.__init__(self)
        # School.make_cake(self)
        # master.__init__(self)
        # master.make_cake(self)

        #方法二：super()
        #2.1,super(当前类名，self).函数()
        #带参数的super用法
        # super(prentice,self).__init__()
        # super(prentice,self).make_cake()

        #不带参数的super用法
        super().__init__()
        super().make_cake()

tudi=prentice()
tudi.make_old_cake()

#总结：super()可以自动查询子类信息，调用顺序为__mro__类属性顺序，比较适合单继承的使用